
package GUI;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.LayoutManager;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import javax.imageio.ImageIO;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;

/**
* Classe Onglet represente l'onglet de conversation avec un utlisateur distant
* @author       Bill 
* @author      Frank Djomo
 * @author      Christelle SIAGO HAPPI
 * @author      djomopoueme@gmail.com
 * @author      christelle.siagohappi@gmail.com
* @version     1.0
*/
public class Onglet extends JPanel{


    private Font font;
    private Font comp;

    private StyledDocument doc ;
    private Style local ;
    private Style remote;
    private Style composing;
    private ImageFond panelfond ;
    private JTextPane areaConversation;
    private JScrollPane scrollPanelConversation;
    private String remoteLogin;
    private int pos ;
    private boolean notified;

     /**
    * @return  nom de l'utilisateur distant associé à l'onglet
    */
    public String getDestination() {
        return remoteLogin;
    }
    /**
    * Contructeur
    * @param remoteLogin Utilisateur distant aasocié à l'onglet
    * @throws IOException
    * @throws URISyntaxException
    */
    public Onglet(String remoteLogin) throws IOException, URISyntaxException{
        this.remoteLogin = remoteLogin;
        pos=0;
        notified=false;
        font = new Font("Cambria", Font.ITALIC, 13);
        comp =new Font("Tahoma",Font.ITALIC,10);

        panelfond= new ImageFond(ImageIO.read(getClass().getResource("/Ressources/images/background.jpg")));
        panelfond.setOpaque(false);

        areaConversation = new JTextPane();
        areaConversation.setBackground(Color.getHSBColor(171, 69, 92));

        areaConversation.setSize(300, 300);
        areaConversation.setOpaque(false);
        areaConversation.setEditable(false);
        scrollPanelConversation = new JScrollPane(areaConversation,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                                                     JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

//        JLayeredPane tempCenter = new JLayeredPane();
//        tempCenter.add(panelfond,Integer.valueOf(0));
//        //tempCenter.add(areaConversation,Integer.valueOf(1));
//        tempCenter.add(scrollPanelConversation,Integer.valueOf(1));
//        tempCenter.setLayout(new LayoutManager() {
//
//            @Override
//            public void addLayoutComponent(String name, Component comp) {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public void removeLayoutComponent(Component comp) {
//                throw new UnsupportedOperationException("Not supported yet.");
//            }
//
//            @Override
//            public Dimension preferredLayoutSize(Container parent) {
//                Component[] components=parent.getComponents();
//                if (components.length==0) {
//                        return new Dimension(0,0);
//                }
//                Dimension d=components[0].getPreferredSize();
//                for (int i=1;i<components.length;i++) {
//                        Dimension tmp=components[i].getPreferredSize();
//                        if (d.width<tmp.width) d.width=tmp.width;
//                        if (d.height<tmp.height) d.height=tmp.height;
//                }
//                return d;
//            }
//
//            @Override
//            public Dimension minimumLayoutSize(Container parent) {
//                Component[] components=parent.getComponents();
//                if (components.length==0) {
//                        return new Dimension(0,0);
//                }
//                Dimension d=components[0].getMinimumSize();
//                for (int i=1;i<components.length;i++) {
//                        Dimension tmp=components[i].getMinimumSize();
//                        if (d.width<tmp.width) d.width=tmp.width;
//                        if (d.height<tmp.height) d.height=tmp.height;
//                }
//                return d;
//            }
//
//            @Override
//            public void layoutContainer(Container parent) {
//                Dimension d=parent.getSize();
//                for (Component c:parent.getComponents()) {
//                        c.setSize(d);
//                }
//            }
//        });
        this.setLayout(new BorderLayout(10,10));
        this.add(scrollPanelConversation,BorderLayout.CENTER);
        setJTextPaneFont();
    }
    /**
    * Définit la police de caractères et le style à utiliser pour la zone de conversation
    */
    private void setJTextPaneFont() {

        Style defaut = areaConversation.getStyle("defaut");
        this.local = areaConversation.addStyle("local", defaut);
        this.remote = areaConversation.addStyle("remote", local);
        this.composing = areaConversation.addStyle("composing", local);

        StyleConstants.setFontFamily(local, font.getFamily());
        StyleConstants.setFontFamily(remote, font.getFamily());
        StyleConstants.setFontFamily(composing, comp.getFamily());

        StyleConstants.setFontSize(local, font.getSize());
        StyleConstants.setFontSize(remote, font.getSize());
        StyleConstants.setFontSize(composing, comp.getSize());

        StyleConstants.setItalic(local, (font.getStyle() & Font.ITALIC) != 0);
        StyleConstants.setItalic(remote, (font.getStyle() & Font.ITALIC) != 0);
        StyleConstants.setItalic(composing, (comp.getStyle() & Font.ITALIC) != 0);

        // Set the font color
        StyleConstants.setForeground(local, Color.BLACK);
        StyleConstants.setForeground(remote, Color.BLUE);
        StyleConstants.setForeground(composing, Color.GRAY);


        // Retrieve the pane's document object
        doc = areaConversation.getStyledDocument();

        doc.setCharacterAttributes(0, doc.getLength() + 1, local, false);
        doc.setCharacterAttributes(0, doc.getLength() + 1, remote, false);
        doc.setCharacterAttributes(0, doc.getLength() + 1, composing, false);
    }
    /**
    * Edite le message texte ecrit par l'utilisateur local
    * @param message message ecrit à envoyer
    * @throws BadLocationException
    */
    public void insertLocalString(String message) throws BadLocationException{
        doc.insertString(pos,message,local);
        panelfond.repaint();
        pos+=message.length();
    }
    /**
    * Edite le message texte ecrit par l'utilisateur distant
    * @param message message ecrit reçu
    * @throws BadLocationException
    */
    public void insertRemoteString(String message) throws BadLocationException{
        doc.insertString(pos,message,remote);
        panelfond.repaint();
        pos+=message.length();
    }
    /**
    * Edite la notification d'ecriture reçu d'un utilisateur distant
    * @param remoteLogin login de l'utilisateur distant
    * @throws BadLocationException
    */
    public void insertComposing(String remoteLogin) throws BadLocationException{
        String notif="( "+remoteLogin+" est entrain d'ecrire un message )";
        this.deleteComposing(remoteLogin);
        doc.insertString(pos,notif,composing);
        notified=true;
        panelfond.repaint();
    }
    /**
    * Supprime la notification d'ecriture reçu d'un utilisateur distant
    * @param remoteLogin login de l'utilisateur distant
    * @throws BadLocationException
    */
    public void deleteComposing(String remoteLogin) throws BadLocationException{
        String notif="( "+remoteLogin+" est entrain d'ecrire un message )";
        if(notified) doc.remove(pos, notif.length());
        notified=false;
        panelfond.repaint();
    }
}